<?php defined('SYSPATH') or die('No direct script access.') ;
/**
 * 文章分类数据模型
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: category.php 1 2014-01-13 15:05:51Z zhouyl $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
class Model_Article_Category extends Model
{

    /**
     * 获取分类数据
     *
     * @return array
     */
    public function all()
    {
        return DB::select()
            ->from('article_categories')
            ->where('deleted', '=', 0)
            ->order_by('sort_order', 'ASC')
            ->order_by('cat_id', 'ASC')
            ->fetch_all();
    }

    /**
     * 获取指定的分类信息
     *
     * @param  int  $cat_id
     * @return array
     */
    public function get($cat_id)
    {
        return DB::select()
            ->from('article_categories')
            ->where('deleted', '=', 0)
            ->where('cat_id', '=', $cat_id)
            ->fetch_row();
    }

    /**
     * 判断是否父类
     *
     * @param  int  $cat_id
     * @return bool
     */
    public function is_parent($cat_id)
    {
        return (bool) DB::select()
            ->from('article_categories')
            ->where('deleted', '=', 0)
            ->where('parent_id', '=', $cat_id)
            ->count_all();
    }

    /**
     * 添加分类信息
     *
     * @param  array  $data
     * @return bool
     */
    public function add(array $data)
    {
        $v = $this->_validate($data);
        $this->validation($v);
        if ( ! $v->check() OR ! empty($this->_errors))
        {
            return FALSE;
        }

        $data = array (
            'parent_id'  => $v->parent_id,
            'name'       => $v->name,
            'is_parent'  => 0,
            'sort_order' => (int) $v->sort_order,
            'is_show'    => (bool) $v->is_show,
        );

        // 写入分类信息
        $result = DB::insert('article_categories', $data)->execute();
        $cat_id = $result[0];

        // 获取路径信息
        $path = $cat_id.';';
        if ($v->parent_id > 0)
        {
            $parent = $this->get($v->parent_id);
            if ( ! $parent)
            {
                return $this->error('parent_id', 'not_found');
            }
            $path = $parent['path'].$path;

            // 更新父类的 is_parent 字段
            DB::update('article_categories', array('is_parent' => 1))
                ->where('cat_id', '=', $parent['cat_id'])
                ->execute();
        }

        // 更新路径信息
        DB::update('article_categories', array('path' => $path))
            ->where('cat_id', '=', $cat_id)
            ->execute();

        return TRUE;
    }

    /**
     * 编辑分类信息
     *
     * @param  int   $cat_id
     * @param  array $data
     * @return bool
     */
    public function edit($cat_id, array $data)
    {
        $category = $this->get($cat_id);

        $v = $this->_validate($data);
        $this->validation($v);
        if ( ! $v->check() OR ! empty($this->_errors))
        {
            return FALSE;
        }

        // 获取路径信息
        $path = $cat_id.';';
        if ($v->parent_id > 0)
        {
            $parent = $this->get($v->parent_id);
            if ( ! $parent)
            {
                return $this->error('parent_id', 'not_found');
            }
            $path = $parent['path'].$path;

            // 更新父类的 is_parent 字段
            if ( ! $parent['is_parent'])
            {
                DB::update('article_categories', array('is_parent' => 1))
                    ->where('cat_id', '=', $parent['cat_id'])
                    ->execute();
            }
        }

        // 是否父类
        $is_parent = (int) $this->is_parent($cat_id);

        // 更新子类路径
        if ($is_parent)
        {
            DB::update('article_categories', array('path' => DB::expr("REPLACE(path, '{$category['path']}', '{$path}')")))
                ->where('path', 'LIKE', $category['path'].'%')
                ->execute();
        }

        // 更新分类信息
        DB::update('article_categories', array (
                'parent_id'  => $v->parent_id,
                'name'       => $v->name,
                'is_parent'  => $is_parent,
                'path'       => $path,
                'sort_order' => (int) $v->sort_order,
                'is_show'    => (bool) $v->is_show,
            ))
            ->where('cat_id', '=', $cat_id)
            ->execute();

        // 更新旧父类的 is_parent 字段
        if ($category['parent_id'] > 0 AND $category['parent_id'] != $v->parent_id)
        {
            DB::update('article_categories', array('is_parent' => $this->is_parent($category['parent_id'])))
                ->where('cat_id', '=', $category['parent_id'])
                ->execute();
        }

        return TRUE;
    }

    /**
     * 删除分类信息
     *
     * @param  int  $cat_id
     * @return bool
     */
    public function del($cat_id)
    {
        $category = $this->get($cat_id);

        if ($category)
        {
            // 删除分类
            DB::update('article_categories', array('deleted' => 1))->where('cat_id', '=', $cat_id)->execute();

            // 更新父类 is_parent 字段
            if ($category['parent_id'] > 0)
            {
                DB::update('article_categories', array('is_parent' => $this->is_parent($category['parent_id'])))
                    ->where('cat_id', '=', $category['parent_id'])
                    ->execute();
            }
        }

        return TRUE;
    }

    /**
     * 数据验证
     *
     * @param  array  $data
     * @return Validation
     */
    protected function _validate(array $data)
    {
        return Validation::factory($data)
            ->rule('name', 'not_empty')
            ->rule('name', 'min_length', array(':value', 2))
            ->rule('name', 'max_length', array(':value', 50))
            ->rule('name', 'regex', array(':value', '/^[^\'\"\:;,\<\>\?\/\\\*\=\+\{\}\[\]\)\(\^%\$#\!`\s]+$/'))
            ->rule('sort_order', 'numeric');
    }

}